package auth_dao

import (
	"admin-system/internal/models/auth_model"
	"context"
	"gorm.io/gorm"
)

type MenuDao struct {
	db *gorm.DB
}

func NewMenuDao(db *gorm.DB) *MenuDao {
	return &MenuDao{db: db}
}

// GetMenuList 获取菜单列表
// @description: 获取菜单列表
// @param: ids []int64 不传值则获取所有菜单
func (m *MenuDao) GetMenuList(ctx context.Context, ids []int64, hidden *int64) (menu []auth_model.Menu, err error) {
	db := m.db.WithContext(ctx).Order("order_num asc")
	if ids != nil {
		db = db.Where("menu_id in ?", ids)
	}
	// 前端获取路由菜单时只返回未被隐藏的菜单
	if hidden != nil && *hidden == 1 {
		db = db.Where("hidden = 0")
	}
	if err := db.Find(&menu).Error; err != nil {
		return nil, err
	}
	return menu, nil
}

// CreateMenu 创建菜单
// @param:
func (m *MenuDao) SaveMenu(ctx context.Context, menu *auth_model.Menu) error {
	menuDb := m.db.WithContext(ctx)
	if menu.ID > 0 {
		return menuDb.Model(&auth_model.Menu{}).Where("id = ?", menu.ID).Updates(menu).Error
	}
	return menuDb.Create(menu).Error
}

// GetMenuByID 根据菜单ID获取菜单信息
//
//	@description: dao层根据菜单ID获取菜单信息，表单编辑菜单（无需判断状态）
//
// @param: id  菜单
func (m *MenuDao) GetMenuByID(ctx context.Context, id int64) (*auth_model.Menu, error) {
	var menu auth_model.Menu
	if err := m.db.WithContext(ctx).Where("id = ?", id).First(&menu).Error; err != nil {
		return nil, err
	}
	return &menu, nil
}

// DelMenu 删除菜单
// @param: id  菜单
func (m *MenuDao) DelMenu(ctx context.Context, id int64) error {
	return m.db.WithContext(ctx).Where("id = ?", id).Delete(&auth_model.Menu{}).Error
}
